/**
 * 判断url是否是http或https
 * @param {string} path
 * @returns {Boolean}
 */
export function isHttp(url: any) {
	return url.indexOf("http://") !== -1 || url.indexOf("https://") !== -1;
}

/**
 * 判断path是否为外链
 * @param {string} path
 * @returns {Boolean}
 */
export function isExternal(path: any) {
	return /^(https?:|mailto:|tel:)/.test(path);
}

/**
 * @param {string} str
 * @returns {Boolean}
 */
export function validUsername(str: any) {
	const valid_map = ["admin", "editor"];
	return valid_map.indexOf(str.trim()) >= 0;
}

/**
 * @param {string} url
 * @returns {Boolean}
 */
export function validURL(url: any) {
	const reg =
		/^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/;
	return reg.test(url);
}
//手机号和固话校验
export function checkMobile(rule: any, value: any, callback: any) {
	let phoneReg = /^1[3456789]\d{9}$/;
	let telReg = /^((0\d{2,3})-)?(\d{7,8})$/;
	console.log(phoneReg.test(value), telReg.test(value));
	if (phoneReg.test(value) || telReg.test(value)) {
		callback();
	} else {
		callback(new Error("格式不正确"));
	}
}
/**
 * @param {string} str
 * @returns {Boolean}
 */
export function validLowerCase(str: any) {
	const reg = /^[a-z]+$/;
	return reg.test(str);
}

/**
 * @param {string} str
 * @returns {Boolean}
 */
export function validUpperCase(str: any) {
	const reg = /^[A-Z]+$/;
	return reg.test(str);
}

/**
 * @param {string} str
 * @returns {Boolean}
 */
export function validAlphabets(str: any) {
	const reg = /^[A-Za-z]+$/;
	return reg.test(str);
}

/**
 * @param {string} email
 * @returns {Boolean}
 */
export function validEmail(email: any) {
	const reg =
		/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
	return reg.test(email);
}

/**
 * @param {string} str
 * @returns {Boolean}
 */
export function isString(str: any) {
	if (typeof str === "string" || str instanceof String) {
		return true;
	}
	return false;
}

/**
 * @param {Array} arg
 * @returns {Boolean}
 */
export function isArray(arg: any) {
	if (typeof Array.isArray === "undefined") {
		return Object.prototype.toString.call(arg) === "[object Array]";
	}
	return Array.isArray(arg);
}

// input 全局验证（搜索）
export function inputGlobalSearch(value: any) {
	let result;
	if (value === "NULL") {
		result = "";
	} else {
		result = value
			? value.replace(
					/[^\a-\z\A-\Z0-9\u4E00-\u9FA5\`\~\!\@\#\$\%\^\&\*\(\)\_\-\=\+\{\}\;\:\'\"\,\.\/\?\|\·\！\￥\（\）\【\】\{\}\、\|\；\：\‘\’\“\”\《\》\，\。\、\？]/g,
					""
			  )
			: "";
	}
	return result;
}
// input 全局验证（搜索--限制特殊字符）
export function inputGlobalSHNoSpecialC(value: any) {
	let result;
	if (value === "NULL") {
		result = "";
	} else {
		result = value ? value.replace(/[^\a-\z\A-\Z0-9\u4E00-\u9FA5]/g, "") : "";
	}
	return result;
}
// 数字
export function inputGlobalNum(value: any) {
	const result = value ? value.replace(/[^0-9]/g, "") : "";
	return result;
}
// 不以 0 开头数字
export function inputGlobalNum1(value: any) {
	const result = value ? value.replace(/\D/g, "").replace(/\./g, "").replace(/^0+/g, "") : "";
	return result;
}
// 排除逗号、句号、感叹号等特殊字符
export function inputGlobalSpechars(value: any) {
	const result = value
		? value.replace(/[^\a-\z\A-\Z0-9\u4E00-\u9FA5\.\,\?\。\，\？\、\-\——\=\;\《\》\！\!\(\)\（\）\+\$]/g, "")
		: "";
	return result;
}
// 带下划线
export function inputGlobalUnderlined(value: any) {
	let result;
	if (value === "NULL") {
		result = "";
	} else {
		result = value ? value.replace(/[^\a-\z\A-\Z0-9\u4E00-\u9FA5\_]/g, "") : "";
	}
	return result;
}

// input 全局验证（表单）
export function inputGlobalValid(rule: any, value: any, callback: any) {
	const reg =
		/^[a-\z\A-\Z0-9\u4E00-\u9FA5\`\~\!\@\#\$\%\^\&\*\(\)\_\-\=\+\{\}\;\:\'\"\,\.\/\?\|\·\！\￥\（\）\【\】\{\}\、\|\；\：\‘\’\“\”\《\》\，\。\、\？]+$/;
	if (value !== "" && !reg.test(value)) {
		callback(new Error("禁止输入非法字符"));
	} else {
		if (value === "NULL") {
			callback(new Error("禁止输入NULL字符"));
		} else {
			callback();
		}
	}
}
// input 全局验证（限制特殊字符）
export function inputGlobalNoSpecialC(rule: any, value: any, callback: any) {
	const reg = /^[a-\z\A-\Z0-9\u4E00-\u9FA5]+$/;
	if (value !== "" && !reg.test(value)) {
		callback(new Error("禁止输入特殊字符"));
	} else {
		if (value === "NULL") {
			callback(new Error("禁止输入NULL字符"));
		} else {
			callback();
		}
	}
}

// 数字验证
export function onlyNumOnePoint(number_only: any, number: number) {
	if (number_only) {
		// 先把非数字的都替换掉，除了数字和小数点
		number_only = number_only.replace(/[^\d.]/g, "");
		// 必须保证第一个为数字而不是小数点
		number_only = number_only.replace(/^\./g, "");
		// 保证只有出现一个小数点而没有多个小数点
		number_only = number_only.replace(/\.{2,}/g, ".");
		// 保证小数点只出现一次，而不能出现两次以上
		number_only = number_only.replace(".", "$#$").replace(/\./g, "").replace("$#$", ".");
		// 保证只能输入两位小数
		if (number == 2) {
			number_only = number_only.replace(/^(\-)*(\d+)\.(\d{0,2}).*$/, "$1$2.$3");
		}
		// 保证只能输入四位小数
		else {
			number_only = number_only.replace(/^(\-)*(\d+)\.(\d{0,4}).*$/, "$1$2.$3");
		}

		// 在不是 0. 开头的字符进行修改：01 => 1
		if (number_only.charAt(0) === "0" && number_only.charAt(1) !== "." && number_only.length >= 2) {
			number_only = number_only.replace(/0/, "");
		}
		// 小数点前 8 位
		if (number_only.indexOf(".") === -1) {
			number_only = number_only.replace(/[^0-9]/g, "").slice(0, 8);
		} else {
			let numArr = number_only.split(".");
			number_only = numArr[0].replace(/[^0-9]/g, "").slice(0, 8) + "." + numArr[1];
		}
		return number_only;
	}
}

// 数字验证 可以为负数
export function canBeMinus(number_only: any, number: number, type: any) {
	if (number_only) {
		// 先把非数字的都替换掉，除了数字和小数点
		number_only = number_only.replace(/[^-\d.]/g, "");
		// 必须保证第一个为数字而不是小数点
		number_only = number_only.replace(/^\./g, "");
		// 保证只有出现一个小数点而没有多个小数点
		number_only = number_only.replace(/\.{2,}/g, ".");
		// 保证小数点只出现一次，而不能出现两次以上
		number_only = number_only.replace(".", "$#$").replace(/\./g, "").replace("$#$", ".");
		// 保证只有出现一个负号而没有多个负号
		number_only = number_only.replace(/\-{2,}/g, "-");
		// 保证负号只出现一次，而不能出现两次以上
		number_only = number_only.replace("-", "$#$").replace(/\-/g, "").replace("$#$", "-");
		// 保证只能输入两位小数
		if (number == 2) {
			// 验证海拔高度
			if (type == "altitude") {
				number_only = number_only.replace(/^(\-)*(\d+)$/, (match: any, sign: any, integerPart: any) => {
					if (integerPart.length > 4) {
						integerPart = integerPart.substr(0, 4);
					}
					return (sign ?? "") + integerPart;
				});
				number_only = number_only.replace(
					/^(\-)*(\d+)\.(\d{0,2}).*$/,
					(match: any, sign: any, integerPart: any, decimalPart: any) => {
						if (integerPart.length > 4) {
							integerPart = integerPart.substr(0, 4);
						}
						if (decimalPart.length > 2) {
							decimalPart = decimalPart.substr(0, 2);
						}
						return (sign ?? "") + integerPart + "." + decimalPart;
					}
				);
			} else {
				number_only = number_only.replace(/^(\-)*(\d+)\.(\d{0,2}).*$/, "$1$2.$3");
			}
		}
		// 保证只能输入六位小数
		else if (number == 6) {
			number_only = number_only.replace(/^(\-)*(\d+)\.(\d{0,6}).*$/, "$1$2.$3");
		}
		// 保证只能输入四位小数
		else {
			number_only = number_only.replace(/^(\-)*(\d+)\.(\d{0,4}).*$/, "$1$2.$3");
		}

		// 在不是 0. 开头的字符进行修改：01 => 1
		if (number_only.charAt(0) === "0" && number_only.charAt(1) !== "." && number_only.length >= 2) {
			number_only = number_only.replace(/0/, "");
		}
		if (number_only.indexOf("-") > -1 && number_only.indexOf("-") > 0) {
			number_only = number_only.replace(/-/, "");
		}
		if (
			number_only.charAt(0) === "-" &&
			number_only.charAt(1) === "0" &&
			number_only.charAt(2) !== "." &&
			number_only.length >= 2
		) {
			number_only = "-0";
		}
		return number_only;
	}
}
// 数字不以小数点结尾
export function pointValid(rule: any, value: any, callback: any) {
	const strNum = value ? value.toString() : "";
	if (strNum && strNum.charAt(strNum.length - 1) === ".") {
		callback(new Error("不能以小数点结尾"));
	} else {
		callback();
	}
}

// 密码验证
export function pwValid(rule: any, value: any, callback: any) {
	const reg = /^[\a-\z\A-\Z0-9\`\~\!\@\#\$\%\^\&\*\(\)\_\-\=\+\,\.\<\>\/\?\|\\/]+$/;
	if (value !== "" && !reg.test(value)) {
		callback(new Error("禁止输入除数字、字母、特殊字符之外的字符"));
	} else {
		if (value === "NULL") {
			callback(new Error("禁止输入NULL字符"));
		} else {
			callback();
		}
	}
}

// 经度
export function longitudeValid(value: any) {
	const reg = /^(\+)?(((\d|[1-9]\d|1[0-7]\d|0{1,3})\.\d{0,4})|(\d|[1-9]\d|1[0-7]\d|0{1,3})|180\.0{0,4}|180)$/;
	if (value !== "" && !reg.test(value)) {
		return false;
	} else {
		if (value === "NULL") {
			return false;
		} else {
			return true;
		}
	}
}

// 纬度
export function latitudeValid(value: any) {
	const reg = /^(\+)?([1-8]?\d{1}\.\d{0,4}|90\.0{0,4}|[1-8]?\d{1}|90)$/;
	if (value !== "" && !reg.test(value)) {
		return false;
	} else {
		if (value === "NULL") {
			return false;
		} else {
			return true;
		}
	}
}
// 表单校验方法
export function noSpecialCode(e: any, type: number) {
	// type1：只能输入 数字
	// type2：只能输入 大写字母、数字
	// type3：只能输入 中文字符
	// type4：只能输入 数字、小数
	// type5：只能# - _ / . 五种字符
	// type6：只能: . () 、五种字符
	// type7：type5和type6 结合
	// type8：字母 数字 特殊字符
	// type9：字母 数字
	// type10：海拔只能输入 数字、小数、负数
	// type11：input 全局验证（表单）新版 能输入（）-
	// default: 只能输入 字母、数字、汉字
	let pattern;
	switch (type) {
		case 1:
			pattern = /[\D]*/g;
			break;
		case 2:
			pattern = /[^A-Z\d]*/g;
			break;
		case 3:
			pattern = /[^\a-\z\A-\Z0-9\u4E00-\u9FA5\.\:\：\；\“\"\'\”\‘\’\,\?\。\，\？\、\-\——\=\;\《\》\！\!\(\)\（\）\+\$]/g;
			break;
		case 4:
			pattern = /[^\Z0-9\.]/g;
			break;
		case 5:
			pattern = /[^\a-\z\A-\Z0-9\u4E00-\u9FA5\#\-\_\/\.]/g;
			break;
		case 6:
			pattern = /[^\a-\z\A-\Z0-9\u4E00-\u9FA5\.\:\：\（\）\(\)\、]/g;
			break;
		case 7:
			pattern = /^(?!.*[\u4e00-\u9fa5])[a-zA-Z0-9!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]*$/g;
			break;
		case 8:
			pattern = /[^\a-\z\A-\Z0-9\!\@\#\$\%\^\&\*\?\(\)\=\+\_\-\~\`\{\}\[\]\|\\\:\;\"\'\<\>\/\.\,\/]/g;
			break;
		case 9:
			pattern = /[^A-Za-z\d]*/g;
			break;
		case 10:
			pattern = /[^\-?\d.]/g;
			break;
		case 11:
			pattern =
				/[^\a-\z\A-\Z0-9\u4E00-\u9FA5\`\~\!\@\#\$\%\^\&\*\(\)\_\-\=\+\{\}\;\:\'\"\,\.\?\|\/\·\！\￥\（\）\【\】\{\}\、\|\；\：\‘\’\“\”\《\》\，\。\、\？/]/g;
			break;
		case 12:
			pattern = /[^\-?\d]/g;
			break;
		default:
			pattern = /[^0-9A-Za-z\u4e00-\u9fa5]*/g;
			break;
	}
	return e.replace(pattern, "");
}
